import 'package:wuxu_flutter_lianxi/dao/home_list_dao.dart';
import 'package:wuxu_flutter_lianxi/net/http_managert.dart';
import 'package:wuxu_flutter_lianxi/widget/pull/pull_new_load_widget.dart';

///
/// 等同Android中MVP模式中的Presenter
///
/// 上拉加载更多、下拉刷新
///
class HomeBloc{
  final PullLoadViewControl pullLoadViewControl = PullLoadViewControl();

  int _page=1;

  ///
  /// doNextFlag ，刷新时需要加载下一个。
  ///
  /// next是个Function类型，当doNextFlag==true 并且next不为空，那么说明数据先加载的本地，需要再从网络获取一遍。
  ///
  pageReset(){
    _page =1;
  }

  pageUp(){
    _page++;
  }

  ///刷新
  requestRefresh( {doNextFlag = true}) async{
    pageReset();

    var res = await HomeListDao.getHomeListData();

    //模拟
    var data = [];
    data.addAll(res.data);
    data.addAll(res.data);
    data.addAll(res.data);
    data.addAll(res.data);
    data.addAll(res.data);
    data.addAll(res.data);
    data.addAll(res.data);
    data.addAll(res.data);
    data.addAll(res.data);
    data.addAll(res.data);

    res.data = data;

    //修改状态，判断是否加载更多
    changeLoadMoreStatus(getLoadMoreStatus(res));
    refreshData(data);
    //刷新数据后，再继续加载下一个
    if(doNextFlag){
      await doNext(res);
    }
    return res;
  }

  doNext(res) async{
    if(res?.next!=null){
      var resNext = await res?.next();
      changeLoadMoreStatus(getLoadMoreStatus(resNext));
      refreshData(resNext);
    }
  }


  bool getLoadMoreStatus(res){
    //TODO:这是示例项目中的写法，咱们这个应用不需要这样写，后面改掉
    return (res!=null && res.data!=null && res.data.length>20);
  }

  void changeLoadMoreStatus(bool status){
    //修改加载状态
    pullLoadViewControl.needLoadMore = status;
  }

  ///加载更多
  requestLoadMore() async{
    pageUp();

    var res = await HomeListDao.getHomeListData();
    changeLoadMoreStatus(getLoadMoreStatus(res));
    loadMore(res.data);
    return res;
  }

  int getDataLength()=> pullLoadViewControl.dataList.length;

  refreshData(data){
    if(data!=null){
      pullLoadViewControl.dataList=data;
    }
  }

  loadMore(res){
    if(res!=null){
      pullLoadViewControl.addList(res);
    }
  }

  clearData(){
    refreshData([]);
  }

  get dataList=>pullLoadViewControl.dataList;

  void dispose(){
    //停止通知
    pullLoadViewControl.dispose();
  }
}